<?php
/*
* author: Fabricio S Costa
* version: 1.0
* email: fabriciojf@gmail.com
*/
require_once('com/fabriciojf/persistence/PDOConnectionFactory.class.php');
require_once('com/fabriciojf/model/Ticket.class.php');
require_once('com/fabriciojf/persistence/UsuarioDAO.class.php');
require_once('com/fabriciojf/persistence/StatusTicketDAO.class.php');


class TicketDAO extends PDOConnectionFactory {

    // irá receber uma conexão
    public $conex = null;

    // constructor
    public function TicketDAO(){}


    // realiza uma inserção
    public function save($ticket){

        try{
            //instancia a conexao
            $this->conex = PDOConnectionFactory::getConnection();

            // executa a query
            $stmt = $this->conex->prepare("INSERT INTO ticket
            (telefone,assunto,mensagem,dataHora,idUsuario,idStatus) VALUES (?,?,?,?,?,?)");

            // valores encapsulados nas variáveis da classe Agenda.
            // sequencia de índices que representa cada valor de minha query
            $stmt->bindValue(1, $ticket->getTelefone());
            $stmt->bindValue(2, $ticket->getAssunto());
            $stmt->bindValue(3, $ticket->getMensagem());
            $stmt->bindValue(4, $ticket->getDataHora());
            $stmt->bindValue(5, $ticket->getUsuario()->getId());            
            $stmt->bindValue(6, $ticket->getStatus()->getId());

            // executo a query preparada
            $stmt->execute();

            // fecho a conexão
            $this->conex = null;

            // caso ocorra um erro, retorna o erro;
        }catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); }
    }


    // realiza uma inserção
    public function update($ticket){

        try{
            //instancia a conexao
            $this->conex = PDOConnectionFactory::getConnection();

            // executa a query
            $stmt = $this->conex->prepare("UPDATE ticket SET telefone=?,assunto=?,mensagem=?,dataHora=?,idStatus=? WHERE id=?");
            // valores encapsulados nas variáveis da classe Agenda.
            // sequencia de índices que representa cada valor de minha query
            $stmt->bindValue(1, $ticket->getTelefone());
            $stmt->bindValue(2, $ticket->getAssunto());
            $stmt->bindValue(3, $ticket->getMensagem());
            $stmt->bindValue(4, $ticket->getDataHora());            
            $stmt->bindValue(5, $ticket->getStatus()->getId());
            $stmt->bindValue(6, $ticket->getId());

            // executo a query preparada
            $stmt->execute();

            // fecho a conexão
            $this->conex = null;

            // caso ocorra um erro, retorna o erro;
        }catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); }
    }

    // realiza uma inserção
    public function updateStatus($idTicket, $idStatus){

        try{
            //instancia a conexao
            $this->conex = PDOConnectionFactory::getConnection();

            // executa a query
            $stmt = $this->conex->prepare("UPDATE ticket SET idStatus=? WHERE id=?");
            // valores encapsulados nas variáveis da classe Agenda.
            // sequencia de índices que representa cada valor de minha query
            $stmt->bindValue(1, $idStatus);
            $stmt->bindValue(2, $idTicket);

            // executo a query preparada
            $stmt->execute();

            // fecho a conexão
            $this->conex = null;

            // caso ocorra um erro, retorna o erro;
        }catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); }
    }

    // remove um registro
    public function remove( $id ){

        try{
            //instancia a conexao
            $this->conex = PDOConnectionFactory::getConnection();

            // executo a query
            $num = $this->conex->exec("DELETE FROM ticket WHERE id=$id");

            // caso seja execuado ele retorna o número de rows que foram afetadas.
            if( $num >= 1 ){ return $num; } else { return 0; }
            // caso ocorra um erro, retorna o erro;

        }catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); }

    }


    // realiza uma listagem
    public function listAll($pagina, $limit){

        try{
            //instancia a conexao
            $this->conex = PDOConnectionFactory::getConnection();
            $list = array();
            $usuarioDao = new UsuarioDao();
            $atendenteDao = new UsuarioDao();
            $statusDao = new StatusTicketDao();

            if (Permission::isInRole(array('admin'))) {                
                $where = 'idStatus = 1';
                $order = ' id asc ';
            } else if (Permission::isInRole(array('usuario'))) {                
                $where = 'idUsuario = '. $idUsuario = $_SESSION['idUsuarioLogado'];
                $order = ' idStatus asc ';
            }
            
            // executo a query
            $stmt = $this->conex->query("SELECT * FROM ticket WHERE " . $where. " ORDER BY " . $order. ", dataHora, id desc LIMIT $pagina,$limit");

            // desconecta
            $this->conex = null;

            if ($stmt) {
                $rows = $stmt->fetchAll();
                $i = 0;
                foreach ($rows as $rs) {
                    $list[$i] = new Ticket();
                    $list[$i]->setId($rs['id']);
                    $list[$i]->setTelefone($rs['telefone']);
                    $list[$i]->setAssunto($rs['assunto']);
                    $list[$i]->setMensagem($rs['mensagem']);
                    $list[$i]->setDataHora($rs['dataHora']);
                    $list[$i]->setUsuario($usuarioDao->findForId($rs['idUsuario']));
                    $list[$i]->setAtendente($atendenteDao->findForId($rs['idAtendente']));
                    $list[$i]->setStatus($statusDao->findForId($rs['idStatus']));
                    $i++;
                }
            }

            return $list;
        }catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); exit;}
    }


    public function findForId($id){

        try{
            //instancia a conexao
            $this->conex = PDOConnectionFactory::getConnection();

            $ticket = new Ticket();
            $usuarioDao = new UsuarioDao();
            $atendenteDao = new UsuarioDao();
            $statusDao = new StatusTicketDao();

            // executo a query
            $stmt = $this->conex->query("SELECT * FROM ticket WHERE id=$id");

            // desconecta
            $this->conex = null;

            if ($stmt) {
                $rows = $stmt->fetchAll();
                foreach ($rows as $rs) {
                    $ticket->setId($rs['id']);
                    $ticket->setTelefone($rs['telefone']);
                    $ticket->setAssunto($rs['assunto']);
                    $ticket->setMensagem($rs['mensagem']);
                    $ticket->setDataHora($rs['dataHora']);
                    $ticket->setUsuario($usuarioDao->findForId($rs['idUsuario']));
                    $ticket->setAtendente($atendenteDao->findForId($rs['idAtendente']));
                    $ticket->setStatus($statusDao->findForId($rs['idStatus']));
                }
            }

            return $ticket;
        }catch ( PDOException $ex ){ echo "Erro: ".$ex->getMessage(); exit;}
    }


}
?>

